#include<stdio.h>
#include<unistd.h>
#include<string.h>

int main()
{
    //C接口
    printf("hello printf\n");
    fprintf(stdout,"%s","hello fprintf\n");
    const char* fputsString = "hello fputs\n";
    fputs(fputsString,stdout);

    //系统接口
    const char* writeString = "hello write\n";
    write(1,writeString,strlen(writeString));

    //代码结束之前，进行创建子进程
    //1、如果我们没有进行输出重定向> ，看到了4条消息
    //stdout 默认使用的是行刷新，在进程fork之前，3条函数已经将数据进行打印输出到显示器上（外设），FILE内部，进程内部不存在对应的数据了。
    //2、如果我们进程了输出重定向> ，写入文件不再是显示器，而是普通文件，采用的刷新策略是全缓冲，之前的3条C显示函数，虽然带了\n，但是不足以
    //将stdout缓冲区写满！数据并没有被刷新。
    //执行fork的时候，stdout属于父进程，创建子进程时，紧接着就是进程退出，谁先退出，一定要进行缓冲区刷新（就是修改）
    //所以，此时，会发生写时拷贝！数据最终会显示两份。
    //3、write为什么没有呢？上面的过程都和write无关，write时系统调用，wirite访问文件没有FILE结构体，而用的是fd，也就没有C提供的缓冲区。
    fork();

    return 0;
}
